package frame;

import dao.DatabaseConnection;
import model.Player;
import util.TransparentTable;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import java.awt.*;
import java.util.ArrayList;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;

/**
 * 排行榜类
 */
public class RankPanel extends JPanel {
    private MainFrame frame; // 主界面，提供切换面板的操作
    private JButton backButton; // 返回暂停菜单按钮
    private JComboBox<String> box; // 切换排序面板的下拉列表框
    private JPanel panel; // 用于切换显示不同的排行榜
    private JPanel classicRank; // 经典模式排行榜面板
    private JPanel tangDouRenRank;// 糖豆人模式排行榜面板

    public RankPanel(MainFrame frame) {


        int model1Ranking = 0; //临时变量，用于显示普通模式排名顺序
        int model2Ranking = 0; //临时变量，用于显示吃豆人排名顺序
        this.frame = frame;
        this.setLayout(new BorderLayout());


        // 初始化界面
        panel = new JPanel();
        classicRank = new JPanel(new BorderLayout());
        tangDouRenRank = new JPanel(new BorderLayout());


        // 创建经典模式排行榜
        createRankPanel(GameMode.CLASSIC_MODE);
        // 创建糖豆人模式排行榜
        createRankPanel(GameMode.TANG_DOUREN_MODE);


        //初始化返回按钮和下拉菜单，并监听点击事件
        initializeComponents();


        //添加
        add(panel, BorderLayout.CENTER);
        add(backButton, BorderLayout.SOUTH);
        add(box, BorderLayout.NORTH);


        // 打开排行榜时默认显示经典模式的排行榜
        switchPanel("经典模式排行榜");


    }


    // 初始化返回按钮和下拉菜单，并监听点击事件
    public void initializeComponents() {
        backButton = new JButton("返回");
        backButton.setPreferredSize(new Dimension(40, 50));
        backButton.setFont(new Font("Courier", Font.BOLD, 28));  // 设置字体、字形、字号
        backButton.setOpaque(true);// 标签设定为不透明

        box = new JComboBox<>(new String[]{"经典模式排行榜", "糖豆人模式排行榜"});
        box.setForeground(new Color(0, 0, 0, 255));
        box.setFont(new Font("Courier", Font.BOLD, 15));

        // 为返回按钮添加动作监听器，点击返回时切换到主菜单
        backButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                frame.setContentPane(new MainViewPanel(frame));
                frame.invalidate();
                frame.validate();
            }
        });

        // 为下拉框添加动作监听器，选择不同的选项时显示不同的排行榜
        box.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                switchPanel((String) box.getSelectedItem());
            }
        });
    }


    // 点击按钮时可以切换排序面板
    public void switchPanel(String item) {
        panel.removeAll();
        JPanel newPanel = classicRank;
        if ("经典模式排行榜".equals(item)) {
            newPanel = classicRank;
        } else if ("糖豆人模式排行榜".equals(item)) {
            newPanel = tangDouRenRank;
        }
        if(newPanel != null){
            panel.add(newPanel);
        }
        panel.revalidate();
        panel.repaint();
    }

    // 枚举类型表示游戏模式
    private enum GameMode {
        CLASSIC_MODE, TANG_DOUREN_MODE
    }

    // 创建排行榜
    private void createRankPanel(GameMode gameMode) {
        // 标题
        String title = gameMode == GameMode.CLASSIC_MODE ? "经典模式排行榜" : "糖豆人模式排行榜";
        int fontSize = gameMode == GameMode.CLASSIC_MODE ? 38 : 38;
        JLabel titleLabel = new JLabel(title);
        titleLabel.setFont(new Font("Courier", Font.BOLD, fontSize));
        titleLabel.setHorizontalAlignment(JLabel.CENTER);
        titleLabel.setOpaque(true);
        titleLabel.setForeground(new Color(72, 72, 72));
        JPanel rankPanel = gameMode == GameMode.CLASSIC_MODE ? classicRank : tangDouRenRank;
        rankPanel.add(titleLabel, BorderLayout.NORTH);
        // 创建表格
        int tableId = gameMode == GameMode.CLASSIC_MODE ? 1 : 2;
        JTable table = createTable(tableId);
        // 创建滚动面板，并将表格添加到面板中
        JScrollPane scrollPane = new JScrollPane(table);
        scrollPane.setBorder(BorderFactory.createEmptyBorder(0, 50, 0, 50)); // 设置滚动面板的边距
        rankPanel.add(scrollPane, BorderLayout.CENTER);
        // 更新表格显示
        table.revalidate();
    }

    // 创建表格的私有方法
    private JTable createTable(int modelNum) {
        // 创建默认表格模型并设置列名
        DefaultTableModel model = new DefaultTableModel() {
            // 设置表格模型为不可编辑
            public boolean isCellEditable(int row, int column) {
                return false;
            }
        };
        model.addColumn("排名");
        model.addColumn("玩家");
        model.addColumn("分数");
        // 创建表格并添加模型
        JTable table = new JTable(model) {
            // 设置表格单元格的对齐方式为居中
            public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
                Component c = super.prepareRenderer(renderer, row, column);
                JLabel l = (JLabel) c;
                l.setHorizontalAlignment(JLabel.CENTER);
                return l;
            }
        };

        // 设置表格的属性
        setTableProperties(table);
        // 添加玩家数据到表格模型
        addPlayersData(model,modelNum);

        return table;
    }


    // 设置表格属性的私有方法
    private void setTableProperties(JTable table) {
        // 设置表头的字体和对齐方式
        DefaultTableCellRenderer renderer = (DefaultTableCellRenderer)table.getTableHeader().getDefaultRenderer();
        renderer.setHorizontalAlignment(JLabel.CENTER);
        table.getTableHeader().setFont(new Font("Courier", Font.BOLD, 34));

        // 设置表格的字体，行高，背景和表格线颜色
        table.setFont(new Font("宋体", Font.BOLD, 28));
        table.setRowHeight(38);
        TransparentTable.setTransparentTable(table);
        table.setGridColor(new Color(0, 0, 0, 0));
    }


    // 添加玩家数据的私有方法
    private void addPlayersData(DefaultTableModel model,int modelNum) {
        // 获取玩家数据
        List<Player> players = DatabaseConnection.findPlayers(modelNum);
        int rank = 1;
        // 将得分大于0的前10名玩家添加到排行榜
        for (Player player : players) {
            if (player.getScore() > 0 && rank <= 10) {
                model.addRow(new Object[]{rank, player.getName(), player.getScore()});
                rank++;
            }
        }
    }
}
